package com.sky.service;

import com.sky.dto.*;
import com.sky.entity.Orders;
import com.sky.result.PageResult;
import com.sky.vo.*;

import java.time.LocalDate;
import java.util.List;

public interface OrderService {

    /**
     * 提交购物车订单
     *
     * @param dto
     * @return
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO dto);

    /**
     * 生成待支付订单
     *
     * @param ordersPaymentDTO 订单相关属性
     * @return
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;

    /**
     * 修改指定订单支付成功
     *
     * @param number
     */
    void paySuccess(String number);

    /**
     * 分页查询订单
     *
     * @param ordersPageQueryDTO page(页码) pageSize(分页大小) status(订单状态)
     * @return
     */
    PageResult pageQueryOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 用户取消订单, 取消的原因默认为 (用户取消)
     * @param id 订单id
     */
    void cancelOrders(Long id);

    /**
     * 管理端取消订单
     *
     * @param ordersCancelDTO
     */
    void cancelOrders(OrdersCancelDTO ordersCancelDTO);

    /**
     * 获取订单及其详情信息
     *
     * @param id 订单id
     * @return 订单视图对象
     */
    OrderVO getOrderWithDetail(Long id);

    /**
     * 再来一单
     *
     * @param id 订单ID
     */
    void repetitionOrder(Long id);

    /**
     * 条件查询订单信息
     *
     * @param ordersPageQueryDTO
     * @return
     */
    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 统计订单状态数量 (2待接单 3已接单 4派送中)
     *
     * @return
     */
    OrderStatisticsVO countOrdersStatus();

    /**
     * 接单 - 根据订单id
     *
     * @param ordersConfirmDTO
     */
    void confirmedOrder(OrdersConfirmDTO ordersConfirmDTO);

    /**
     * 拒单 - 根据订单id
     *
     * @param rejectionDTO
     */
    void rejectOrders(OrdersRejectionDTO rejectionDTO);

    /**
     * 将订单id，状态设置为派送中
     *
     * @param id
     */
    void deliveryOrders(Long id);

    /**
     * 完成订单，状态设置为完成
     * @param id 订单id
     */
    void completeOrders(Long id);

    /**
     * 用户催单
     *
     * @param id
     */
    void reminder(Long id);

    /**
     * 获取当天订单统计信息
     * @param reportDTO 开始时间 - 结束时间
     * @return 订单统计视图对象
     */
    OrderReportVO getOrderStatistics(ReportDTO reportDTO);

    /**
     * 获取营业额统计
     * @param reportDTO
     * @return
     */
    TurnoverReportVO getTurnoverStatistics(ReportDTO reportDTO);

    /**
     * 获取用户统计
     * @param reportDTO
     * @return
     */
    UserReportVO getUserStatistics(ReportDTO reportDTO);

    /**
     * 获取销量TOP10
     * @param reportDTO
     * @return
     */
    SalesTop10ReportVO getSalesTop10(ReportDTO reportDTO);
}
